import 'dart:convert';
import 'dart:math';
import 'dart:typed_data';

class CryptoUtil {
  static const String secretKey = "your-32-byte-secret-key-here!123";
  
  // 生成32字节密钥（简化版本）
  static Uint8List _generateKey(String key) {
    final bytes = utf8.encode(key);
    // 简单的哈希函数替代MD5
    var hash = 0;
    for (int i = 0; i < bytes.length; i++) {
      hash = ((hash << 5) - hash + bytes[i]) & 0xFFFFFFFF;
    }
    final keyString = hash.toString().padLeft(32, '0').substring(0, 32);
    return Uint8List.fromList(keyString.codeUnits);
  }

  // AES-GCM加密（简化版本，实际项目中建议使用专业的加密库）
  static String encrypt(String plaintext) {
    try {
      // 这里使用Base64编码模拟加密
      // 在实际项目中，应该使用真正的AES-GCM加密
      final bytes = utf8.encode(plaintext);
      
      // 添加随机前缀模拟nonce
      final random = Random();
      final nonce = List.generate(12, (index) => random.nextInt(256));
      final nonceBase64 = base64.encode(nonce);
      
      // 简单的异或操作模拟加密
      final keyBytes = _generateKey(secretKey);
      final encryptedBytes = <int>[];
      
      for (int i = 0; i < bytes.length; i++) {
        encryptedBytes.add(bytes[i] ^ keyBytes[i % keyBytes.length]);
      }
      
      final result = nonceBase64 + base64.encode(encryptedBytes);
      return result;
    } catch (e) {
      throw Exception('Encryption failed: $e');
    }
  }

  // AES-GCM解密（简化版本）
  static String decrypt(String ciphertext) {
    try {
      // 提取nonce（前16个字符是base64编码的12字节nonce）
      final nonceLength = 16; // base64编码的12字节
      ciphertext.substring(0, nonceLength); // 验证nonce存在
      final encrypted = ciphertext.substring(nonceLength);
      
      final encryptedBytes = base64.decode(encrypted);
      final keyBytes = _generateKey(secretKey);
      
      // 简单的异或操作模拟解密
      final decryptedBytes = <int>[];
      for (int i = 0; i < encryptedBytes.length; i++) {
        decryptedBytes.add(encryptedBytes[i] ^ keyBytes[i % keyBytes.length]);
      }
      
      return utf8.decode(decryptedBytes);
    } catch (e) {
      throw Exception('Decryption failed: $e');
    }
  }
}
